home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / picture / dycubpic.c < prev    next >
Text File  |  1993-09-23  |  2KB  |  103 lines

  1. //    Copyright 1993 Ralph Gonzalez
  2.  
  3. /*
  4. *    FILE:        dycubpic.c
  5. *    AUTHOR:        R. Gonzalez
  6. *    CREATED:    November 25, 1991
  7. *
  8. *    Sample dynamic pict application.
  9. */
  10.  
  11. # include    "dycubpic.h"
  12. # include    "dycube.h"
  13. # define    NUM_ITERATIONS    400
  14. # define    FRICTION        .95
  15. # define    TRAMPOLINE        -6.
  16.  
  17. /******************************************************************
  18. *    initialize
  19. ******************************************************************/
  20. Dy_Cube_Pict::Dy_Cube_Pict(void)
  21. {
  22.     Translation        *transl;
  23.     
  24.     projector1 = new Projector;
  25.     projector1->set_background_color(RED);
  26.     projector1->set_cropping_frame(0.,-.05,1.,.5);
  27.     projector1->set_projection_frame(0.,0.,1.8,.9);
  28.  
  29.     projector2 = new Corner_Projector;
  30.     
  31.     projector1->set_screen(screen);
  32.     projector2->set_screen(screen);
  33.     
  34.     camera1 = new Camera;
  35.     camera1->set_position(0.,3.,0.,0.,.29,0.);
  36.     camera1->set_focal_length(.6);
  37.     camera2 = new Camera;
  38.     camera2->set_position(0.,10.,10.,0.,PI/2.,0.);
  39.     camera2->set_focal_length(2.);
  40.     
  41.     transl = new Translation;
  42.     transl->set(0.,2.,10.);
  43.     
  44.     segment = new Fast_Dynamic_Cube;
  45.     segment->move(transl);
  46.     segment->set_acceleration(0.,-1.,0.);
  47.     
  48.     delete transl;
  49. }
  50.  
  51. /******************************************************************
  52. *    run
  53. ******************************************************************/
  54. void    Dy_Cube_Pict::run(void)
  55. {
  56.     int                i;
  57.     Transformation    *identity;
  58.     Translation        *bouncer;
  59.     double            time = .2,    // should be length of an iteration 
  60.                     depth;
  61.                                     
  62.     identity = new Transformation;
  63.     bouncer = new Translation;
  64.     
  65.     for (i=0 ; i<NUM_ITERATIONS && !screen->mouse_button_is_down() ; i++)
  66.     {
  67.         projector1->clear();
  68.         segment->set_color(YELLOW);
  69.         segment->draw(camera1,projector1,identity);
  70.         projector2->clear();
  71.         segment->set_color(BLUE);
  72.         segment->draw(camera2,projector2,identity);
  73.         segment->animate();        /* nothing happens for Dynamic_Cube */
  74.         segment->simulate(time);
  75.         if ((depth = segment->get_center_y()) < TRAMPOLINE)
  76.         {
  77.             segment->vy = -segment->vy * FRICTION;
  78.             bouncer->set(0.,2.*(TRAMPOLINE-depth),0.);
  79.             segment->move(bouncer);
  80.         }
  81.     }
  82.     
  83.     screen->wait();
  84.     
  85.     delete identity;
  86.     delete bouncer;
  87. }
  88.  
  89. /******************************************************************
  90. *    destroy
  91. ******************************************************************/
  92. Dy_Cube_Pict::~Dy_Cube_Pict(void)
  93. {
  94.     delete projector1;
  95.     delete projector2;
  96.  
  97.     delete camera1;
  98.     delete camera2;
  99.     
  100.     delete segment;
  101. }
  102.  
  103.